# -*- coding:utf-8 -*-
"""
配置文件管理模块
用于读取和解析项目配置文件
"""

import os
import configparser

# 获取当前文件的绝对路径目录
current_dir = os.path.abspath(os.path.dirname(__file__))


class OperationalError(Exception):
    """自定义异常类：操作错误"""


class Dictionary(dict):
    """自定义字典类，支持通过属性访问字典值"""

    def __getattr__(self, key):
        """支持通过 .key 方式访问字典值"""
        return self.get(key, None)

    # 使用字典的内置方法
    __setattr__ = dict.__setitem__
    __delattr__ = dict.__delitem__


class Config:
    """
    配置管理类
    负责读取配置文件并提供配置项访问接口
    """

    def __init__(self, file_name="conf", cfg=None):
        """
        初始化配置管理器

        @param file_name: 配置文件名（不包含扩展名），默认为"conf"
        @param cfg: 配置文件完整路径，如果为None则使用默认路径
        """
        # 读取环境变量，筛选以TEST_开头的变量
        env = {}
        for key, value in os.environ.items():
            if key.startswith("TEST_"):
                env[key] = value

        # 创建配置解析器实例
        config = configparser.ConfigParser(env)

        # 读取配置文件
        if cfg:
            # 如果指定了配置文件路径，则读取指定文件
            config.read(cfg)
        else:
            # 否则读取默认路径下的配置文件 conf/conf.ini
            config.read(os.path.join(current_dir, "conf", "%s.ini" % file_name))

        # 解析配置文件内容
        for section in config.sections():
            # 为每个配置节创建Dictionary对象
            setattr(self, section, Dictionary())
            # 遍历节中的每个配置项
            for name, raw_value in config.items(section):
                try:
                    # 特殊处理：避免'0'和'1'被解析为布尔值
                    if config.get(section, name) in ["0", "1"]:
                        raise ValueError

                    # 尝试解析为布尔值
                    value = config.getboolean(section, name)
                except ValueError:
                    try:
                        # 尝试解析为整数
                        value = config.getint(section, name)
                    except ValueError:
                        # 默认作为字符串处理
                        value = config.get(section, name)

                # 将配置项设置为对象属性
                setattr(getattr(self, section), name, value)

    def get(self, section):
        """
        获取指定节的配置项

        @param section: 要获取的配置节名称
        @return: 配置节对应的Dictionary对象
        @raise OperationalError: 当配置节不存在时抛出异常
        """
        try:
            return getattr(self, section)
        except AttributeError as e:
            raise OperationalError("配置项 %s 在配置文件中未找到, 错误: %s" %
                                   (section, e))


if __name__ == "__main__":
    # 测试代码
    conf = Config()
    # print(conf.get("FILE_DATA").wav_path)
    # print(conf.get("FILE_DATA").label_file)
